package control;

import model.Constante;
import model.Funcoes;
import model.Planeta;
import Jama.Matrix;

public class Main {

	
	
	public static void main(String[] args) {
		long inicio=System.currentTimeMillis();
		Matrix posicao=new Matrix(2,1);
		Matrix velocidade=new Matrix(2,1);
		int dimensao=2;
		double massa;
		
		massa=5.9736*Math.pow(10, 24);
		posicao.set(0, 0, 1.4709*Math.pow(10,11)/Constante.unidadeAstronomica);
		velocidade.set(1, 0, 3.029*Math.pow(10,4)*Constante.segundosAno/Constante.unidadeAstronomica);
		Planeta terra=new Planeta(massa, posicao,velocidade);
		
		massa=1.9891*Math.pow(10, 30);
		posicao=new Matrix(dimensao,1);
		velocidade=new Matrix(dimensao,1);
		Planeta sol=new Planeta(massa, posicao,velocidade);
		
		terra.setConstante(Constante.gravitacional*terra.getMassa()*Math.pow(Constante.segundosAno, 2)/Math.pow(Constante.unidadeAstronomica, 3));
		sol.setConstante(Constante.gravitacional*sol.getMassa()*Math.pow(Constante.segundosAno, 2)/Math.pow(Constante.unidadeAstronomica, 3));
		
		double tFinal=4;
		double dt=(1/365.25);
		int T=(int)(tFinal/dt);
		
		Matrix V11,V21,V31,V41,V12,V22,V32,V42;
		Matrix A11,A21,A31,A41,A12,A22,A32,A42;
		Matrix tempr1,tempr2,tempv1,tempv2; 
		Matrix V1,V2,A1,A2;
		
		posicao=terra.getPosicao();
		
		for(int i=1;i<T;i++){
			V11=terra.getVelocidade();
			A11=Funcoes.f1(sol, terra.getPosicao(), sol.getPosicao());
			
			V12=sol.getVelocidade();
			A12=Funcoes.f1(terra, sol.getPosicao(), terra.getPosicao());
			
			tempr1=terra.getPosicao().plus(V11.times(dt/2));
			tempr2=sol.getPosicao().plus(V12.times(dt/2));
			tempv1=terra.getVelocidade().plus(A11.times(dt/2));
			tempv2=sol.getVelocidade().plus(A12.times(dt/2));
			
			V21=tempv1;
			A21=Funcoes.f1(sol, tempr1, tempr2);
			
			V22=tempv2;
			A22=Funcoes.f1(terra, tempr2, tempr1);
			
			tempr1=terra.getPosicao().plus(V21.times(dt/2));
			tempr2=sol.getPosicao().plus(V22.times(dt/2));
			tempv1=terra.getVelocidade().plus(A21.times(dt/2));
			tempv2=sol.getVelocidade().plus(A22.times(dt/2));
			
			V31=tempv1;
			A31=Funcoes.f1(sol, tempr1, tempr2);
			
			V32=tempv2;
			A32=Funcoes.f1(terra, tempr2, tempr1);
			
			tempr1=terra.getPosicao().plus(V31.times(dt));
			tempr2=sol.getPosicao().plus(V32.times(dt));
			tempv1=terra.getVelocidade().plus(A31.times(dt));
			tempv2=sol.getVelocidade().plus(A32.times(dt));
			
			V41=tempv1;
			A41=Funcoes.f1(sol, tempr1, tempr2);
			
			V42=tempv2;
			A42=Funcoes.f1(terra, tempr2, tempr1);
			
			V1=V11.plus(V21.times(2).plus(V31.times(2).plus(V41))).times(1.0/6);
			V2=V12.plus(V22.times(2).plus(V32.times(2).plus(V42))).times(1.0/6);
			A1=A11.plus(A21.times(2).plus(A31.times(2).plus(A41))).times(1.0/6);
			A2=A12.plus(A22.times(2).plus(A32.times(2).plus(A42))).times(1.0/6);
			
//			V11.print(3, 20);
//			V21.print(3, 20);
//			V31.print(3, 20);
//			V41.print(3, 20);
//			V1.print(3, 20);
			
			tempr1=terra.getPosicao().plus(V1.times(dt));
			tempr2=sol.getPosicao().plus(V2.times(dt));
			tempv1=terra.getVelocidade().plus(A1.times(dt));
			tempv2=sol.getVelocidade().plus(A2.times(dt));
			
			terra.setPosicao(tempr1);
			terra.setVelocidade(tempv1);
			sol.setPosicao(tempr2);
			sol.setVelocidade(tempv2);
		}
		
		System.out.println(terra.getPosicao().minus(posicao).norm2());
		
		long fim=System.currentTimeMillis();
		System.out.println(fim-inicio);
		System.exit(0);
	}
}
